home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 22 code / PCI Driver Sample / NCR_MiniTest / MacSCSICommand.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-27  |  12.8 KB  |  389 lines  |  [TEXT/MPCC]

  1. /*                            MacScsiCommand.h                            */
  2. /*
  3.  * Scsi-specific definitions.
  4.  */
  5. #ifndef __MacSCSICommand__
  6. #define __MacSCSICommand__
  7.  
  8. /*
  9.  * The 6-byte commands are used for most simple
  10.  * I/O requests.
  11.  */
  12. struct SCSI_6_Byte_Command {                /* Six-byte command            */
  13.     unsigned char        opcode;                /*  0                        */
  14.     unsigned char        lbn3;                /*  1 lbn in low 5            */
  15.     unsigned char        lbn2;                /*  2                        */
  16.     unsigned char        lbn1;                /*  3                        */
  17.     unsigned char        len;                /*  4                        */
  18.     unsigned char        ctrl;                /*  5                        */
  19. };
  20. typedef struct SCSI_6_Byte_Command SCSI_6_Byte_Command;
  21.  
  22. struct SCSI_10_Byte_Command {                /* Ten-byte command            */
  23.     unsigned char        opcode;                /*  0                        */
  24.     unsigned char        lun;                /*  1                        */
  25.     unsigned char        lbn4;                /*  2                        */
  26.     unsigned char        lbn3;                /*  3                        */
  27.     unsigned char        lbn2;                /*  4                        */
  28.     unsigned char        lbn1;                /*  5                        */
  29.     unsigned char        pad;                /*  6                        */
  30.     unsigned char        len2;                /*  7                        */
  31.     unsigned char        len1;                /*  8                        */
  32.     unsigned char        ctrl;                /*  9                        */
  33. };
  34. typedef struct SCSI_10_Byte_Command SCSI_10_Byte_Command;
  35.  
  36. struct SCSI_12_Byte_Command {                /* Twelve-byte command        */
  37.     unsigned char        opcode;                /*  0                        */
  38.     unsigned char        lun;                /*  1                        */
  39.     unsigned char        lbn4;                /*  2                        */
  40.     unsigned char        lbn3;                /*  3                        */
  41.     unsigned char        lbn2;                /*  4                        */
  42.     unsigned char        lbn1;                /*  5                        */
  43.     unsigned char        len4;                /*  6                        */
  44.     unsigned char        len3;                /*  7                        */
  45.     unsigned char        len2;                /*  8                        */
  46.     unsigned char        len1;                /*  9                        */
  47.     unsigned char        pad;                /* 10                        */
  48.     unsigned char        ctrl;                /* 11                        */
  49. };
  50. typedef struct SCSI_12_Byte_Command SCSI_12_Byte_Command;
  51.  
  52. /*
  53.  * This union defines all scsi commands.
  54.  */
  55. union SCSI_Command {
  56.     SCSI_6_Byte_Command        scsi6;
  57.     SCSI_10_Byte_Command    scsi10;
  58.     SCSI_12_Byte_Command    scsi12;
  59.     unsigned char            scsi[12];
  60. };
  61. typedef union SCSI_Command SCSI_Command, *SCSI_CommandPtr;
  62.  
  63. /*
  64.  * Returned by a read-capacity command.
  65.  */
  66. struct SCSI_Capacity_Data {
  67.     unsigned char        lbn4;                /* Number                    */
  68.     unsigned char        lbn3;                /*  of                        */
  69.     unsigned char        lbn2;                /*   logical                */
  70.     unsigned char        lbn1;                /*    blocks                */
  71.     unsigned char        len4;                /* Length                    */
  72.     unsigned char        len3;                /*  of each                    */
  73.     unsigned char        len2;                /*   logical block            */
  74.     unsigned char        len1;                /*    in bytes                */
  75. };
  76. typedef struct SCSI_Capacity_Data SCSI_Capacity_Data;
  77.  
  78. struct SCSI_Inquiry_Data {                    /* Inquiry returns this        */
  79.     unsigned char        devType;            /*  0 Device type,            */
  80.     unsigned char        devTypeMod;            /*  1 Device type modifier    */
  81.     unsigned char        version;            /*  2 ISO/ECMA/ANSI version    */
  82.     unsigned char        format;                /*  3 Response data format    */
  83.     unsigned char        length;                /*  4 Additional Length        */
  84.     unsigned char        reserved5;            /*  5 Reserved                */
  85.     unsigned char        reserved6;            /*  6 Reserved                */
  86.     unsigned char        flags;                /*  7 Capability flags        */
  87.     unsigned char        vendor[8];            /*  8-15 Vendor-specific    */
  88.     unsigned char        product[16];        /* 16-31 Product id            */
  89.     unsigned char        revision[4];        /* 32-35 Product revision    */
  90.     unsigned char        vendorSpecific[20]; /* 36-55 Vendor stuff        */
  91.     unsigned char        moreReserved[40];    /* 56-95 Reserved            */
  92. };
  93. typedef struct SCSI_Inquiry_Data SCSI_Inquiry_Data;
  94.  
  95. /*
  96.  * This bit may be set in devTypeMod
  97.  */
  98. enum {
  99.     kScsiInquiryRMB = 0x80                    /* Removable medium    if set    */
  100. };
  101. /*
  102.  * These bits may be set in flags
  103.  */
  104. enum {
  105.     kScsiInquiryRelAdr    = 0x80,                /* Has relative addressing    */
  106.     kScsiInquiryWBus32    = 0x40,                /* Wide (32-bit) transfers    */
  107.     kScsiInquiryWBus16    = 0x20,                /* Wide (16-bit) transfers    */
  108.     kScsiInquirySync    = 0x10,                /* Synchronous transfers    */
  109.     kScsiInquiryLinked    = 0x08,                /* Linked commands ok        */
  110.     kScsiInquiryReserved = 0x04,
  111.     kScsiInquiryCmdQue    = 0x02,                /* Tagged cmd queuing ok    */
  112.     kScsiInquirySftRe    = 0x01                /* Soft reset alternative    */
  113. };
  114.  
  115. enum {
  116.     kScsiDevTypeDirect                    = 0,
  117.     kScsiDevTypeSequential,
  118.     kScsiDevTypePrinter,
  119.     kScsiDevTypeProcessor,
  120.     kScsiDevTypeWorm,                        /* Write-once, read multiple        */
  121.     kScsiDevTypeCDROM,
  122.     kScsiDevTypeScanner,
  123.     kScsiDevTypeOptical,
  124.     kScsiDevTypeChanger,
  125.     kScsiDevTypeComm,
  126.     kScsiDevTypeGraphicArts0A,
  127.     kScsiDevTypeGraphicArts0B,
  128.     kScsiDevTypeFirstReserved,                /* Start of reserved sequence        */
  129.     kScsiDevTypeUnknownOrMissing        = 0x1F,
  130.     kScsiDevTypeMask                    = 0x1F
  131. };
  132. /*
  133.  * These are device type modifiers. We need them to distinguish between "unknown"
  134.  * and "missing" devices.
  135.  */
  136. enum {
  137.     kScsiDevTypeQualifierConnected        = 0x00,    /* Exists and is connected        */
  138.     kScsiDevTypeQualifierNotConnected    = 0x20,    /* Logical unit exists            */
  139.     kScsiDevTypeQualifierReserved        = 0x40,
  140.     kScsiDevTypeQualifierMissing        = 0x60,    /* No such logical unit            */
  141.     kScsiDevTypeQualifierVendorSpecific    = 0x80,    /* Other bits are unspecified    */
  142.     kScsiDevTypeQualifierMask            = 0xE0
  143. };
  144. #define kScsiDevTypeMissing    \
  145.     (kScsiDevTypeUnknownOrMissing | kScsiDevTypeQualifierMissing)
  146.  
  147. /*
  148.  * This is the data that is returned after a GetExtendedStatus
  149.  * request. The errorCode gives a general indication of the error,
  150.  * which may be qualified by the additionalSenseCode and
  151.  * additionalSenseQualifier fields. These may be device (vendor)
  152.  * specific values, however. The info[] field contains additional
  153.  * information. For a media error, it contains the failing
  154.  * logical block number (most-significant byte first).
  155.  */
  156. struct SCSI_Sense_Data {                /* Request Sense result            */
  157.     unsigned char        errorCode;        /*  0    Class code, valid lbn    */
  158.     unsigned char        segmentNumber;    /*  1    Segment number            */
  159.     unsigned char        senseKey;        /*  2    Sense key and flags        */
  160.     unsigned char        info[4];
  161.     unsigned char        additionalSenseLength;
  162.     unsigned char        reservedForCopy[4];
  163.     unsigned char        additionalSenseCode;
  164.     unsigned char        additionalSenseQualifier;    
  165.     unsigned char        fruCode;        /* Field replacable unit code    */
  166.     unsigned char        senseKeySpecific[2];
  167.     unsigned char        additional[101];
  168. };
  169. typedef struct SCSI_Sense_Data SCSI_Sense_Data;
  170. /*
  171.  * The high-bit of errorCode signals whether there is a logical
  172.  * block. The low value signals whether there is a valid sense
  173.  */
  174. #define kScsiSenseHasLBN            0x80    /* Logical block number set    */
  175. #define kScsiSenseInfoValid            0x70    /* Is sense key valid?        */
  176. #define kScsiSenseInfoMask            0x70    /* Mask for sense info        */
  177. /*
  178.  * These bits may be set in the sense key
  179.  */
  180. #define kScsiSenseKeyMask            0x0F
  181. #define kScsiSenseILI                0x20    /* Illegal logical Length    */
  182. #define kScsiSenseEOM                0x40    /* End of media                */
  183. #define kScsiSenseFileMark            0x80    /* End of file mark            */
  184.  
  185. /*
  186.  * SCSI sense codes. (Returned after request sense).
  187.  */
  188. #define     kScsiSenseNone                0x00    /* No error                    */
  189. #define     kScsiSenseRecoveredErr        0x01    /* Warning                    */
  190. #define     kScsiSenseNotReady            0x02    /* Device not ready            */
  191. #define     kScsiSenseMediumErr        0x03    /* Device medium error        */
  192. #define     kScsiSenseHardwareErr        0x04    /* Device hardware error    */
  193. #define     kScsiSenseIllegalReq        0x05    /* Illegal request for dev.    */
  194. #define     kScsiSenseUnitAtn            0x06    /* Unit attention (not err)    */
  195. #define     kScsiSenseDataProtect        0x07    /* Data protection            */
  196. #define     kScsiSenseBlankCheck        0x08    /* Tape-specific error        */
  197. #define     kScsiSenseVendorSpecific    0x09    /* Vendor-specific error    */
  198. #define     kScsiSenseCopyAborted        0x0a    /* Copy request cancelled    */
  199. #define     kScsiSenseAbortedCmd        0x0b    /* Initiator aborted cmd.    */
  200. #define     kScsiSenseEqual            0x0c    /* Comparison equal            */
  201. #define     kScsiSenseVolumeOverflow    0x0d    /* Write past end mark        */
  202. #define     kScsiSenseMiscompare        0x0e    /* Comparison failed        */
  203. #define     kScsiSenseCurrentErr        0x70
  204. #define     kScsiSenseDeferredErr        0x71
  205.  
  206. /*
  207.  * Mode sense parameter header
  208.  */
  209. struct SCSI_ModeParamHeader {
  210.     unsigned char        modeDataLength;
  211.     unsigned char        mediumType;
  212.     unsigned char        deviceSpecific;
  213.     unsigned char        blockDescriptorLength;
  214. };
  215. typedef struct SCSI_ModeParamHeader SCSI_ModeParamHeader;
  216.  
  217. struct SCSI_ModeParamBlockDescriptor {
  218.     unsigned char        densityCode;
  219.     unsigned char        numberOfBlocks[3];
  220.     unsigned char        reserved;
  221.     unsigned char        blockLength[3];
  222. };
  223. typedef struct SCSI_ModeParamBlockDescriptor SCSI_ModeParamBlockDescriptor;
  224.  
  225. union SCSI_ModeParamPage {
  226.     unsigned char        data[1];
  227.     struct {
  228.         unsigned char    code;
  229.         unsigned char    length;
  230.     } page;
  231. };
  232. typedef union SCSI_ModeParamPage SCSI_ModeParamPage;
  233.  
  234. /*
  235.  * LogSense parameter header
  236.  */
  237. struct SCSI_LogSenseParamHeader {
  238.     unsigned char        pageCode;
  239.     unsigned char        reserved;
  240.     unsigned char        pageLength[2];
  241. };
  242. typedef struct SCSI_LogSenseParamHeader SCSI_LogSenseParamHeader;
  243.  
  244. /*
  245.  * Log parameter pages are variable-length with a fixed length header.
  246.  */
  247. union SCSI_LogSenseParamPage {
  248.     unsigned char        data[1];
  249.     struct {
  250.         unsigned char    parameterCode[2];
  251.         unsigned char    flags;
  252.         unsigned char    parameterLength;
  253.     } page;
  254. };
  255. typedef union SCSI_LogSenseParamPage SCSI_LogSenseParamPage;
  256.  
  257. /*
  258.  * SCSI command status (from status phase)
  259.  */
  260. #define     kScsiStatusGood            0x00    /* Normal completion        */
  261. #define     kScsiStatusCheckCondition    0x02    /* Need GetExtendedStatus    */
  262. #define     kScsiStatusConditionMet    0x04
  263. #define     kScsiStatusBusy            0x08    /* Device busy (self-test?)    */
  264. #define     kScsiStatusIntermediate    0x10    /* Intermediate status        */
  265. #define     kScsiStatusResConflict        0x18    /* Reservation conflict        */
  266. #define     kScsiStatusQueueFull        0x28    /* Target can't do command    */
  267. #define     kScsiStatusReservedMask    0x3e    /* Vendor specific?            */
  268.  
  269. /*
  270.  * SCSI command codes. Commands defined as ...6, ...10, ...12, are
  271.  * six-byte, ten-byte, and twelve-byte variants of the indicated command.
  272.  */
  273. /*
  274.  * These commands are supported for all devices.
  275.  */
  276. #define kScsiCmdChangeDefinition    0x40
  277. #define kScsiCmdCompare                0x39
  278. #define kScsiCmdCopy                0x18
  279. #define kScsiCmdCopyAndVerify        0x3a
  280. #define kScsiCmdInquiry                0x12
  281. #define kScsiCmdLogSelect            0x4c
  282. #define kScsiCmdLogSense            0x4d
  283. #define kScsiCmdModeSelect12        0x55
  284. #define kScsiCmdModeSelect6            0x15
  285. #define kScsiCmdModeSense12            0x5a
  286. #define kScsiCmdModeSense6            0x1a
  287. #define kScsiCmdReadBuffer            0x3c
  288. #define kScsiCmdRecvDiagResult        0x1c
  289. #define kScsiCmdRequestSense        0x03
  290. #define kScsiCmdSendDiagnostic        0x1d
  291. #define kScsiCmdTestUnitReady        0x00
  292. #define kScsiCmdWriteBuffer            0x3b
  293.  
  294. /*
  295.  * These commands are supported by direct-access devices only.
  296.  */
  297. #define kScsiCmdFormatUnit            0x04
  298. #define kSCSICmdCopy                0x18
  299. #define kSCSICmdCopyAndVerify        0x3a
  300. #define kScsiCmdLockUnlockCache        0x36
  301. #define kScsiCmdPrefetch            0x34
  302. #define kScsiCmdPreventAllowRemoval    0x1e
  303. #define kScsiCmdRead6                0x08
  304. #define kScsiCmdRead10                0x28
  305. #define kScsiCmdReadCapacity        0x25
  306. #define kScsiCmdReadDefectData        0x37
  307. #define kScsiCmdReadLong            0x3e
  308. #define kScsiCmdReassignBlocks        0x07
  309. #define kScsiCmdRelease                0x17
  310. #define kScsiCmdReserve                0x16
  311. #define kScsiCmdRezeroUnit            0x01
  312. #define kScsiCmdSearchDataEql        0x31
  313. #define kScsiCmdSearchDataHigh        0x30
  314. #define kScsiCmdSearchDataLow        0x32
  315. #define kScsiCmdSeek6                0x0b
  316. #define kScsiCmdSeek10                0x2b
  317. #define kScsiCmdSetLimits            0x33
  318. #define kScsiCmdStartStopUnit        0x1b
  319. #define kScsiCmdSynchronizeCache    0x35
  320. #define kScsiCmdVerify                0x2f
  321. #define kScsiCmdWrite6                0x0a
  322. #define kScsiCmdWrite10                0x2a
  323. #define kScsiCmdWriteAndVerify        0x2e
  324. #define kScsiCmdWriteLong            0x3f
  325. #define kScsiCmdWriteSame            0x41
  326.  
  327. /*
  328.  * These commands are supported by sequential devices.
  329.  */
  330. #define kScsiCmdRewind                0x01
  331. #define kScsiCmdWriteFilemarks        0x10
  332. #define kScsiCmdSpace                0x11
  333. #define kScsiCmdLoadUnload            0x1B
  334. /*
  335.  * ANSI SCSI-II for CD-ROM devices.
  336.  */
  337. #define kScsiCmdReadCDTableOfContents    0x43
  338.  
  339. /*
  340.  * Message codes (for Msg In and Msg Out phases). The Macintosh
  341.  * SCSI Manager can't really deal with these.
  342.  */
  343. #define kScsiMsgAbort                0x06
  344. #define kScsiMsgAbortTag            0x0d
  345. #define kScsiMsgBusDeviceReset        0x0c
  346. #define kScsiMsgClearQueue            0x0e
  347. #define kScsiMsgCmdComplete            0x00
  348. #define kScsiMsgDisconnect            0x04
  349. #define kScsiMsgIdentify            0x80
  350. #define kScsiMsgIgnoreWideResdue    0x23
  351. #define kScsiMsgInitiateRecovery    0x0f
  352. #define kScsiMsgInitiatorDetectedErr 0x05
  353. #define kScsiMsgLinkedCmdComplete    0x0a
  354. #define kScsiMsgLinkedCmdCompleteFlag 0x0b
  355. #define kScsiMsgParityErr            0x09
  356. #define kScsiMsgRejectMsg            0x07
  357. #define kScsiMsgModifyDataPtr        0x00 /* Extended msg        */
  358. #define kScsiMsgNop                    0x08
  359. #define kScsiMsgHeadOfQueueTag        0x21 /* Two byte msg        */
  360. #define kScsiMsgOrderedQueueTag        0x22 /* Two byte msg        */
  361. #define kScsiMsgSimpleQueueTag        0x20 /* Two byte msg        */
  362. #define kScsiMsgReleaseRecovery        0x10
  363. #define kScsiMsgRestorePointers        0x03
  364. #define kScsiMsgSaveDataPointers    0x02
  365. #define kScsiMsgSyncXferReq            0x01 /* Extended msg        */
  366. #define kScsiMsgWideDataXferReq        0x03 /* Extended msg        */
  367. #define kScsiMsgTerminateIOP        0x11
  368. #define kScsiMsgExtended            0x01
  369.  
  370. #define kScsiMsgTwoByte                0x20
  371. #define kScsiMsgTwoByteMin            0x20
  372. #define kScsiMsgTwoByteMax            0x2f
  373.  
  374. /*
  375.  * Default timeout times for SCSI commands (times are in Msec).
  376.  */
  377. #define kScsiNormalCompletionTime    (500L)            /* 1/2 second                */
  378. /*
  379.  * Dratted DAT tape.
  380.  */
  381. #define kScsiDATCompletionTime        (60L * 1000L);    /* One minute                */
  382. /*
  383.  * Yes, we do allow 90 seconds for spin-up of those dratted tape drives.
  384.  */
  385. #define kScsiSpinUpCompletionTime    (90L * 1000L)
  386.  
  387.  
  388. #endif /* __MacSCSICommand__ */
  389.